package src.src;

/**
 * Clase de implementación de BubbleSort
 * Adaptada del libro "Data Structures in Java for the Principled Programmer"
 * @author Duane A. Bailey - Grupo 5
 */
public class bubbleSort {

    /**
     * Retiene temporalmente los datos
     */
    protected static Comparable[] data;

    /**
     * Realiza un ordenamiento con el algoritmo de encapsulamiento
     * pre: 0 <= n <= data.length
     * post: valores en data[0..n-1] en orden ascendente
     * @param data datos a ordenar
     * @param n tamaño del arreglo
     */
    public static void bubbleSort_srt(Comparable[] data, int n) {
        int numSorted = 0; // number of values in order
        int index; // general index
        while (numSorted < n) {
            // bubble a large element to higher array index
            for (index = 1; index < n - numSorted; index++) {
                if (data[index - 1].compareTo(data[index]) > 0) {
                    data = swap(data, index - 1, index);
                }
            }
            // at least one more value in place
            numSorted++;
        }

        setData(data);
    }

    /**
     * Intercambia los datos en la posición index1 con la posición index2
     * @param data Arreglo de datos a modificar
     * @param index1 primera posición
     * @param index2 segunda posición
     * @return Arreglo con datos intercambiados
     */
    public static Comparable[] swap(Comparable[] data, int index1, int index2) {
        Comparable temp = data[index1];
        data[index1] = data[index2];
        data[index2] = temp;
        return data;
    }

    /**
     * Define la forma de obtener los datos
     * @return arreglo de datos
     */
    public static Comparable[] getData() {
        return data;
    }

    /**
     * Define la forma de interactuar con los datos
     * @param data1 el nuevo arreglo de datos
     */
    public static void setData(Comparable[] data1) {
        data = data1;
    }
}
